package com.spring.core;

import java.io.File;
import java.net.URL;
import java.net.URLDecoder;
import java.util.Enumeration;
import java.util.concurrent.ConcurrentHashMap;

public class AnnotationApplicationContext implements ApplicationContext {

    //1、创建  ConcurrentHashMap是线程安全的集合类   分段函数；通过锁的方式来达到线程安全的(JUC了解)
    // HashMap是线程安全的集合类
    // jdk1.8数组+链表   数组+红黑树
    //创建ConcurrentHashMap集合，存放bean对象
    private ConcurrentHashMap<Class, Object> beanFactory = new ConcurrentHashMap<>();

    private static String rootPath;

    //    返回对象
    @Override
    public Object getBean(Class clazz) {
        return beanFactory.get(clazz);
    }

    //创建有参构造，传递包路径，设置包扫描规则,
    // 当前包及其子包，哪个类有@Bean注解，找到注解后把这个类通过反射进行实例化
    public AnnotationApplicationContext(String basePackage) {
        try {
            //1、把.替换成\
            String packagePath = basePackage.replaceAll("\\.", "\\\\");
            //2、获取包绝对路径
            Enumeration<URL> urls = Thread.currentThread().getContextClassLoader().getResources(packagePath);
            while (urls.hasMoreElements()) {
                URL url = urls.nextElement();
                String filePath = URLDecoder.decode(url.getFile(), "utf-8");
                //3、获取包前面路径部分，字符按串截取
                rootPath = filePath.substring(0, filePath.length() - packagePath.length());
                //4、包扫描
                loadBean(new File(filePath));
            }

        } catch (Exception e) {
            throw new RuntimeException(e);
        }
//        依赖注入
    }

    //包扫描，实例化
    private void loadBean(File file) {
//       1、判断当前是否是文件夹
        if (file.isDirectory()) {
//       2、获取文件夹里面所有内容
            File[] childrenFiles = file.listFiles();
            //       3、判断文件夹里面为空，直接返回
            if (childrenFiles==null|| childrenFiles.length==0){
                return;
            }
            //       4、 如果文件夹里面不为空，遍历文件夹里面所有内容
            for (File child : childrenFiles) {
                //       4.1、遍历得到每个File对象，继续判断，如果还是文件夹，递归
                if (child.isDirectory()){
                    //递归
                    loadBean(child);
                }else {
                    //       4.2、遍历得到File对象不是文件夹，是文件

                }
            }
        }





//       4.3、得到包路径+类名称部分-字符串截取
//       4.4、判断当前文件类是否为.class
//       4.5、如果是.class 类型，把路径\替换成.  把.class去掉
//       4.6、判断类上面是否有注解@Bean,如果有进行实例化过程
//       4.6.1、获取类的Class
//       4.6.2、判断不是接口
//       4.6.3、判断类上面是否有注解  @Bean
//       4.6.4、实例化
//       4.7、把对象实例化之后，放到ConcurrentHashMap集合beanFactory
//       4.7.1判断当前类如果有接口，让接口class作为map的key

    }


    //    属性注入
    private void loadDi() {
//        实例化对象在beanFactory的ConcurrentHashMap集合里

    }


}
